package com.learn.io.bio.bothway.persistent.novice;

import com.learn.constant.CommonConstant;
import com.learn.constant.MathConstant;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Socket持续通信:服务器
 *
 * 新手写法，能够循环处理多个Socket请求
 *
 * 不过当一个请求的处理比较耗时的时候，后面的请求将被阻塞，
 * 所以一般都是用多线程的方式来处理Socket，即每有一个Socket请求的时候，就创建一个线程来处理它。
 */
public class SocketServer {

    static String message = "Hello Client,I get the message.";

    public static void main(String[] args) throws Exception {
        // 监听指定的端口
        int port = CommonConstant.SOCKET_SERVER_PORT;
        ServerSocket server = new ServerSocket(port);
        // server将一直等待连接的到来
        System.out.println("server将一直等待连接的到来");

        while(true){
            Socket socket = server.accept();
            // 建立好连接后，从socket中获取输入流，并建立缓冲区进行读取
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[MathConstant.INT_1024];
            int len;
            StringBuilder sb = new StringBuilder();
            while ((len = inputStream.read(bytes)) != MathConstant.INT_MINUS_ONE) {
                // 注意指定编码格式，发送方和接收方一定要统一，建议使用UTF-8
                sb.append(new String(bytes, MathConstant.INT_ZERO, len, CommonConstant.DEFAULT_CHARSET_NAME));
            }
            System.out.println("get message from client: " + sb);

            // 返回消息
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write(message.getBytes(CommonConstant.DEFAULT_CHARSET_NAME));

            inputStream.close();
            outputStream.close();
            socket.close();
        }
    }
}
